﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using LiteDB;

namespace 枸杞VBE插件.代码库
{
    internal static class 代码库助手
    {
        internal static string 数据库地址 { get => $@"{配置.插件路径}\代码库\Data.db"; }

        internal static LiteDatabase Db;
        internal static ConnectionString ConnectionString = new ConnectionString();
        internal static ILiteCollection<代码> CodeDb { get => Db.GetCollection<代码>(); }

        internal static LiteDatabase CreateDatabase()
        {
            ConnectionString ConnectionString = new ConnectionString()
            {
                Filename = 数据库地址,
                Connection = ConnectionType.Shared,
                ReadOnly = true
            };
            return new LiteDatabase(ConnectionString);
        }

        #region 查

        internal static 代码 按关键字查询代码库(string 关键字)
        {
            return CodeDb
                .Query()
                .Where(x => x.是否启用)
                .Where(x => x.关键字 == 关键字)
                .FirstOrDefault();
        }

        internal static List<代码> 查询所有已启用代码()
        {
            return CodeDb
                .Query()
                .Where(x => x.是否启用)
                .OrderBy(x => x.关键字)
                .ToList();
        }

        internal static List<代码> 查询一级菜单()
        {
            return CodeDb
                .Query()
                .Where(代码 => 代码.是否启用)
                .Where(代码 => !Regex.IsMatch(代码.关键字, @".+\\.+\\.+"))
                .OrderBy(代码 => 代码.关键字)
                .ToList();
        }

        internal static List<(string 关键字, int 计数)> 查询次级控件()
        {
            var q = CodeDb.Query().Where(a => a.是否启用).ToList();
            var l = q.Join(q, x => q, y => q, (a, b) => new { a, b })
            .Where(x => (x.a.关键字 == x.b.关键字 || x.b.关键字.Contains(x.a.关键字 + '\\'))
                                                    && Regex.IsMatch(x.a.关键字, @".+\\.+\\.+"))
            .GroupBy(x => x.a.关键字)
            .Select(x => ((string 关键字, int 计数))(x.Key, x.Count()))
            .OrderBy(x => x.关键字)
            .ToList();
            return l;
        }

        internal static List<代码> 查询代码库()
        {
            return CodeDb.Query().ToList();
        }

        #endregion 查

        #region 改增

        internal static int 更新代码(IEnumerable<代码> 代码)
        {
            return CodeDb.Upsert(代码);
        }

        internal static bool 更新代码(代码 代码)
        {
            return CodeDb.Upsert(代码);
        }

        #endregion 改增

        #region 删

        internal static void 删除代码(代码 代码)
        {
            CodeDb.Delete(代码.ID);
        }

        #endregion 删

        internal class 代码
        {
            public int ID { get; set; }
            public string 关键字 { get; set; }

            public string 代码类型 { get; set; }

            public string 代码文本 { get; set; }

            public bool 是否启用 { get; set; } = true;
        }
    }
}